package com.hhxy.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.hhxy.constants.SystemConstants;
import com.hhxy.handler.exception.CustomException;
import com.hhxy.mapper.CommentMapper;
import com.hhxy.model.dto.AddCommentDto;
import com.hhxy.model.entity.Comment;
import com.hhxy.model.vo.CommentVo;
import com.hhxy.model.vo.PageVo;
import com.hhxy.service.CommentService;
import com.hhxy.service.UserService;
import com.hhxy.utils.BeanCopyUtils;
import com.hhxy.utils.response.AppHttpCodeEnum;
import com.hhxy.utils.response.ResponseResult;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.List;
import java.util.Objects;

/**
 * @author ghp
 * @description 针对表【tb_comment(评论表)】的数据库操作Service实现
 * @createDate 2023-04-25 11:58:43
 */
@Service
public class CommentServiceImpl extends ServiceImpl<CommentMapper, Comment>
        implements CommentService {

    @Resource
    private UserService userService;

    /**
     * 分页条件查询所有已通过审核的评论
     *
     * @param pageNum
     * @param pageSize
     * @param commentType
     * @param articleId
     * @return
     */
    @Override
    public ResponseResult commentList(Integer pageNum, Integer pageSize, String commentType, Long articleId) {
        // 分页条件查询所有已通过审核的评论
        Page<Comment> page = new Page<>(pageNum, pageSize);
        this.page(page, new LambdaQueryWrapper<Comment>()
                        // 根据文章的id来查询根评论
                        .eq(Objects.nonNull(articleId), Comment::getArticleId, articleId)
                        // 确保评论是根评论
                        .eq(Comment::getRootId, SystemConstants.COMMENT_ROOT)
                        // 确保评论的类型
                        .eq(Comment::getType, commentType)
                // 根据评论的创建时间进行降序排序
//                        .orderByDesc(Comment::getUpdateTime)
                // TODO 出现了Bug
        );

        // 按照评论的更新时间进行降序排序
//        List<Comment> commentList = page.getRecords().stream()
//                .sorted(Comparator.comparing(Comment::getUpdateTime).reversed())
//                .collect(Collectors.toList());

        // 封装VO
        // 构建父子评论嵌套结构
        List<CommentVo> commentVoList = toCommentVoList(page.getRecords());
        // 查询所有根评论对应的子评论集合，并且赋值给对应的children属性
        for (CommentVo commentVo : commentVoList) {
            // 查询根评论对应的子评论
            List<CommentVo> children = getChildren(commentVo.getId());
            // 为children字段进行赋值
            commentVo.setChildren(children);
        }

        return ResponseResult.okResult(new PageVo(commentVoList, page.getTotal()));
    }

    /**
     * 根据根评论的id查询所对应的子评论的集合（在查询的同时构建父子评论嵌套结构）
     */
    private List<CommentVo> getChildren(Long id) {
        // 查询根评论下的子评论
        List<Comment> commentList = this.list(new LambdaQueryWrapper<Comment>()
                .eq(Comment::getRootId, id)
                .orderByDesc(Comment::getUpdateTime));
        // 构建父子评论嵌套结构
        List<CommentVo> commentVos = toCommentVoList(commentList);
        return commentVos;
    }

    /**
     * 将List<Comment>转换成List<CommentVo>，同时为VO新增的字段进行赋值
     */
    private List<CommentVo> toCommentVoList(List<Comment> list) {
        // entity转成VO（新增一些需要响应的字段）
        List<CommentVo> commentVos = BeanCopyUtils.copyBeanList(list, CommentVo.class);
        // 遍历VO集合（为新增的字段进行赋值）
        for (CommentVo commentVo : commentVos) {
            // 通过createBy查询用户的昵称并赋值
            String nickName = userService.getById(commentVo.getCreateBy()).getNickName();
            commentVo.setUsername(nickName);
            // 通过toCommentUserId查询用户的昵称并赋值
            // 如果toCommentUserId不为-1才进行查询（根评论不具有该属性）
            if (commentVo.getToCommentUserId() != -1) {
                String toCommentUserName = userService.getById(commentVo.getToCommentUserId()).getNickName();
                commentVo.setToCommentUserName(toCommentUserName);
            }
        }
        return commentVos;
    }

    /**
     * 新增评论
     *
     * @param addCommentDto
     * @return
     */
    @Override
    public ResponseResult addComment(AddCommentDto addCommentDto) {
        Comment comment = BeanCopyUtils.copyBean(addCommentDto, Comment.class);
        boolean flag = this.save(comment);
        if (!flag) {
            throw new CustomException(AppHttpCodeEnum.SERVICE_INSERT_ERROR);
        }
        return ResponseResult.okResult();
    }

}




